package com.ideal.frame.runner;

import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.ideal.frame.common.dto.ResponseModel;
import com.ideal.frame.config.RootProperties;
import com.ideal.frame.node.entity.NodeSyncEvent;
import com.ideal.frame.node.entity.RootNodeTb;
import com.ideal.frame.node.form.search.RootNodeSyncParams;
import com.ideal.frame.node.service.NodeSyncEventService;
import com.ideal.frame.node.service.NodeSyncService;
import com.ideal.frame.node.service.RootNodeService;
import com.ideal.frame.prefix.entity.PrefixNetxTb;
import com.ideal.frame.prefix.form.search.PrefixSyncParams;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 根节点启动时，自动将节点所需要的数据进行加载
 *
 * @author: zhangdelei
 * @date: 2021/9/15-4:59 下午
 * @Description:
 **/
@Slf4j
@Service
public class RootNodeRunner {
    @Value("${node.level}")
    private Integer nodeLevel;
    @Value("${node.prefix}")
    private String nodePrefix;
    @Autowired
    private NodeSyncService nodeSyncService;
    @Autowired
    private RootProperties rootProperties;
    @Autowired
    private NodeSyncEventService nodeSyncEventService;
    @Autowired
    private RootNodeService rootNodeService;

    @Async
    public void runSync() {
        try {
            // 只有根节点启动的时候才会执行该模块
            log.info("开始执行数据同步线程=================================================================================begin++++当前节点级别:" + nodeLevel);
            if (nodeLevel == -1) {
                // 获取上一次同步的时间点
                NodeSyncEvent event = nodeSyncEventService.lastSync(0, nodePrefix);
                log.info("上一次同步记录：" + JSONUtil.toJsonStr(event));
                // 获取所有待同步的根节点列表
                String url = rootProperties.getFindSyncRoot()
                        .replace("{ip}", rootProperties.getRootIp())
                        .replace("{port}", String.valueOf(rootProperties.getRootPort()));
                log.info("同步接口：" + url);
                ResponseModel<String> response = nodeSyncService.post(RootNodeSyncParams.builder().syncTime(event == null ? null : event.getSyncTime()).build(), url, null);
                log.info("同步数据结果：" + JSONUtil.toJsonStr(response.getData()));
                JSONArray array = JSONUtil.parseArray(JSONUtil.toJsonStr(response.getData()));
                List<RootNodeTb> nodeTbs = JSONUtil.toList(array, RootNodeTb.class);
                if (nodeTbs != null && nodeTbs.size() > 0) {
                    // 同步根节点信息
                    log.info("开始同步根节点信息=================================================================================");
                    rootNodeService.syncRootData(nodeTbs);
                }
                log.info("开始同步前缀信息=================================================================================");
                // 同步前缀信息
                nodeSyncService.initSyncPrefixData();
                log.info("开始同步节点信息=================================================================================");
                // 同步节点信息
                nodeSyncService.initSyncNodeData();
            }
            log.info("数据同步线程结束=================================================================================end");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
